package com.lambert.ginkgo.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.Map;

import static com.lambert.ginkgo.properties.WebClientProperties.PREFIX;


/**
 * WebClient配置属性类，支持动态配置
 */
@Data
@ConfigurationProperties(prefix = PREFIX)
public class WebClientProperties {

    public static final String PREFIX = "ginkgo.webclient";

    /**
     * 基础URL，所有请求的基准URL
     * 如配置了此属性，方法中的URL可以使用相对路径
     */
    private String baseUrl;

    /**
     * 连接超时时间，单位：毫秒
     * 表示建立TCP连接的超时时间
     */
    private int connectTimeout = 3000;

    /**
     * 读取超时时间，单位：毫秒
     * 表示从服务器读取数据的超时时间
     */
    private int readTimeout = 5000;

    /**
     * 写入超时时间，单位：毫秒
     * 表示向服务器写入数据的超时时间
     */
    private int writeTimeout = 5000;

    /**
     * 响应超时时间，单位：毫秒
     * 表示从发送请求到收到完整响应的总超时时间
     */
    private int responseTimeout = 10000;

    /**
     * 是否使用连接池
     * true表示启用连接池，false表示每次请求创建新连接
     */
    private boolean useConnectionPool = true;

    /**
     * 最大连接数
     * 当使用连接池时，允许的最大连接数量
     */
    private int maxConnections = 50;

    /**
     * 获取连接超时时间，单位：毫秒
     * 当连接池所有连接都在使用时，等待获取连接的超时时间
     */
    private int acquireTimeout = 2000;

    /**
     * 连接最大空闲时间，单位：毫秒
     * 当连接空闲超过此时长，将被关闭并从池中移除
     */
    private int idleTimeout = 30000;

    /**
     * 线程池大小
     * 用于执行WebClient订阅操作的线程数量
     */
    private int threadPoolSize = 10;

    /**
     * 线程池名称前缀
     * 用于标识线程池中的线程，便于日志和监控
     */
    private String threadPoolNamePrefix = "web-client-";

    /**
     * 重试最大次数
     * 当请求失败时，最多重试的次数
     */
    private int retryMaxAttempts = 3;

    /**
     * 重试初始退避时间，单位：毫秒
     * 第一次重试前的等待时间，后续重试时间按指数增长
     */
    private int retryInitialBackoff = 1000;

    /**
     * 重试抖动因子，范围0.0-1.0
     * 用于在退避时间基础上添加随机抖动，避免请求集中
     */
    private double retryJitter = 0.5;

    /**
     * TraceId请求头名称
     * 用于在分布式系统中传递追踪ID的HTTP头名称
     */
    private String traceIdHeaderName = "X-Trace-Id";

    /**
     * 默认请求头
     * 所有请求都会带上的HTTP头信息
     */
    private Map<String, String> defaultHeaders = new HashMap<>();

}
